#include "mylineedit.h"
#include <QFocusEvent>

// 构造函数，初始化 MyLineEdit 类
MyLineEdit::MyLineEdit(QWidget *parent)
    : QLineEdit{parent}
{
    // 设置焦点，当鼠标点击时获取焦点
    this->setFocus(Qt::MouseFocusReason);
    list = nullptr;
}

// 设置与 MyLineEdit 关联的下拉列表
void MyLineEdit::setDropDownList(QListWidget *theList)
{
    // 将传入的列表指针赋值给成员变量 list
    list = theList;
}

// 处理事件，主要处理键盘按键事件
bool MyLineEdit::event(QEvent *e)
{
    // 检查是否设置了下拉列表，并且事件类型为按键事件
    if (list && e->type() == QEvent::KeyPress) {
        // 将事件转换为按键事件
        QKeyEvent *ke = static_cast<QKeyEvent *>(e);
        // 检查是否按下了 Tab 键
        if (ke->key() == Qt::Key_Tab) {
            // 将下拉列表当前选中的文本设置为输入框的文本
            this->setText(list->currentIndex().data(Qt::DisplayRole).toString());
            return true; // 事件已处理
        }
    }
    // 事件未处理，调用基类 QLineEdit 的事件处理
    return QLineEdit::event(e);
}

// 处理按键事件
void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
    // 检查是否设置了下拉列表
    if (list) {
        // 如果按下了向上方向键
        if (Qt::Key_Up == event->key()) {
            int row = list->currentRow(); // 获取当前行号
            // 如果不是第一行，则移动到上一行
            if (row) {
                list->setCurrentRow(list->currentRow() - 1);
            }
            return; // 处理完毕
        }
        // 如果按下了向下方向键
        if (Qt::Key_Down == event->key()) {
            int row = list->currentRow(); // 获取当前行号
            // 如果不是最后一行，则移动到下一行
            if (row < list->count() - 1) {
                list->setCurrentRow(list->currentRow() + 1);
            }
            return; // 处理完毕
        }
        // 如果按下了回车键
        if (Qt::Key_Return == event->key()) {
            // 获取当前选中的单词
            QString word = list->currentIndex().data(Qt::DisplayRole).toString();
            // 如果选中的单词不为空，则设置为输入框的文本
            if (!word.isEmpty())
                this->setText(word);
            // 取消阻塞信号
            this->blockSignals(false);
            // 发出 returnPressed() 信号
            emit returnPressed();
            return; // 处理完毕
        }
    }
    // 调用基类的按键处理函数
    QLineEdit::keyPressEvent(event);
}

// 当输入框获取焦点时的事件处理
void MyLineEdit::focusInEvent(QFocusEvent *e)
{
    // 发出自定义的 focusIn() 信号
    emit focusIn();
    this->setPlaceholderText("");//清空提示词
    // 设置输入框的样式：文字为蓝色，背景为淡蓝色
    setStyleSheet("QLineEdit{color:blue;background-color:#edf2ff;}");
    // 调用基类的焦点获取事件处理函数
    QLineEdit::focusInEvent(e);
}

// 当输入框失去焦点时的事件处理
void MyLineEdit::focusOutEvent(QFocusEvent *e)
{
    // 发出自定义的 focusOut() 信号
    emit focusOut();
    this->setPlaceholderText("寻找你喜欢的音乐...");//重新设置提示词
    // 设置输入框的样式：文字为黑色，背景为浅灰色
    setStyleSheet("QLineEdit{color:black;background-color:#f2f2f4;}");
    // 调用基类的焦点失去事件处理函数
    QLineEdit::focusOutEvent(e);
}

